package cn.gyn.gynrpc.core.util;

import lombok.extern.slf4j.Slf4j;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Slf4j
public class MethodUtils {

    public static boolean checkLocalMethod(final String method) {
        //本地方法不代理？
        //这里获取方法名，比较判断object的基础方法，(点进Object,从idea左边三个方块的structure里看)，进行null返回过滤
        if (method.equals("toString") ||
                method.equals("Object") ||
                method.equals("getClass") ||
                method.equals("hashCode") ||
                method.equals("equals") ||
                method.equals("clone") ||
                method.equals("notify") ||
                method.equals("notifyAll") ||
                method.equals("wait") ||
                method.equals("finalize")) {
            return true;
        }
        return false;
    }

    //如果方法是Object类里的本地方法，比如equals等就返回true （这里是一个更简单的写法，对比Object类里的方法）
    public static boolean checkLocalMethod(final Method method) {
        return method.getDeclaringClass().equals(Object.class);
    }

    /**
     * 通过方法签名获取指定的唯一方法
     * 方法名@方法参数数目_各入参的类型
     * @param method
     * @return
     */
    public static String methodSign(Method method) {
        StringBuilder sb = new StringBuilder(method.getName());
        sb.append("@").append(method.getParameterCount());
        Arrays.stream(method.getParameterTypes()).forEach(
                t -> {
                    sb.append("_").append(t.getCanonicalName());
                }
        );
        return sb.toString();
    }

    public static String methodSign(Method method, Integer test) {
        return null;
    }

    public static void main(String[] args) {
        Arrays.stream(MethodUtils.class.getMethods()).forEach(
                m -> {
                    log.debug(methodSign(m));
                }
        );
    }

    /**
     * 获取带有GynConsumer注解的所有field
     * @param aClass
     * @param annotationClass
     * @return
     */
    public static List<Field> findAnnotatedField(Class<?> aClass, Class<? extends Annotation> annotationClass) {
        List<Field> result = new ArrayList<>();
        while (aClass != null) {
            Field[] fields = aClass.getDeclaredFields();
            for (Field f : fields) {
                if (f.isAnnotationPresent(annotationClass)) {
                    result.add(f);
                }
            }
            aClass = aClass.getSuperclass();
        }
        return result;
    }

}
